package notes.java.concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Sysnchronize 测试
 * 
 * @author wangcs
 *
 */
public class T8_TestSynch2 {

	// 修饰一个类
	public static void test(String name) {
		synchronized (T8_TestSynch2.class) {
			for (int i = 0; i < 10; i++) {
				System.out.println("test1:" + name + "," + i);
			}
			System.out.println("------");
		}
	}

	// 修饰静态方法
	public synchronized void test2(String name) {
		for (int i = 0; i < 10; i++) {
			System.out.println("test2:" + name + "," + i);
		}
		System.out.println("------");
	}

	// 测试一：一个T8_TestSynch时，作用于所有的对象
	public static void r() {
		// 启动了10个线程，同时执行（结果是顺序的，不会交叉乱序。）
		ExecutorService service = Executors.newCachedThreadPool();
		T8_TestSynch2 synch = new T8_TestSynch2();
		for (int i = 0; i < 10; i++) {
			service.execute(() -> {
				synch.test("线程1");
			});
		}
	}

	// 测试二：两个T8_TestSynch时，作用于所有的对象
	public static void r2() {
		// 启动了10个线程，同时执行（结果是顺序的，不会交叉乱序。）
		ExecutorService service = Executors.newCachedThreadPool();
		T8_TestSynch2 synch = new T8_TestSynch2();
		for (int i = 0; i < 10; i++) {
			service.execute(() -> {
				synch.test("线程1");
			});
		}

		// 证明修饰代码块作用所有的对象（打印结果是顺序的是正常的）
		T8_TestSynch2 synch2 = new T8_TestSynch2();
		for (int i = 0; i < 10; i++) {
			service.execute(() -> {
				synch2.test("线程2");
			});
		}
	}

	public static void main(String[] args) {
//		r();
		r2();
	}

}
